//checkbox
(function($$) {
    $.fn.jCheckboxList = function(opt) {
        var option = {
            root: '',  //  checkbox id of "select all"
            childCls: ''  // another checkboxs
        };
        var opt = $.extend({}, option, opt);
        var el = $(this).attr('id');
        var allchild = "#" + el + " :input[type=checkbox]." + opt.childCls;
        $("#" + opt.root).click(function() {
            var isChecked = $(this).attr('checked');
            if (isChecked)
                $(allchild).attr('checked', true);
            else
                $(allchild).attr('checked', false);
        });

        $.each($(allchild), function(i, v) {
            var all = $(allchild).length;
            $(v).click(function() {
                var count = $(allchild + "[checked]").length;
                if (count == all)
                    $("#" + opt.root).attr('checked', true);
                else
                    $("#" + opt.root).attr('checked', false);
            });
        });
    }
})();

//tohash
;(function($) {
    $.fn.formatHash = function(){
        var json = '';
        $(this).each(function(){
            //alert(this.tagName);
            $(this).find('select[name],input[name],textarea[name]').each(function(){
                var str = '';
                if(this.tagName.toLowerCase() == 'select'){
                    if(this.id.substr(0,4) == 'sel_'){
                        if($('#'+this.id.replace('sel_', 'checkall_')).attr('checked') && !$(this).data('filter')){
                            return true;
                        }
                    }
                    for(var i=0; i<this.options.length; i++){
                        if(this.options[i].selected){
                            if(str != '') str += ',';
                            str += this.options[i].value;
                        }
                    }
                }else{
                    var input_type = $(this).attr('type');
                    if(input_type == '' || input_type == 'text' || input_type == 'hidden' || ((input_type == 'checkbox' || input_type == 'radio') && $(this).attr('checked'))){
                        str = this.value;
                    }
                }
                if(str != ''){
                    if(json != '') json += ',';
                    json += '"'+$(this).attr('name')+'":"'+str+'"';
                }
            });
        });
		 /* var json = '('+json+')';
        //alert(json);
        return eval(json); */
        var _json = null;
        json = '_json={'+json+'};';
        //alert(json);
        eval(json);
        return _json;
    };
})(jQuery);

//selectFilter
;(function($) {
    $.fn.selectFilter = function(sel){
        return $(this).each(function(){
            if($(this).data('init')){
                $(this).data('reload', true);
                return;
            }
            var select = this;
            var rows = $(this).find('option');
            var input = $('<input type="text" style="display:block;width:'+(parseInt($(this).css('width')) - 5)+'px;" />');
            $(this).before(input);
            $(this).data('init', true);
            $(this).data('reload', false);
            $(this).data('filter', false);
            input.keyup(function(){
                if($(select).attr('disabled') || $(this).attr('readonly')) return;
                var text = $(this).val();
                if($(select).data('reload')){
                    rows = $(select).find('option');
                    $(select).data('reload', false)
                }
                var filter_rows = rows.filter(function (i) {
                        //if($(this).text().substr(0, text.length).toLowerCase() == text.toLowerCase()) return $(this);
                        var re = new RegExp(text, 'ig');
                        if (re.test($(this).text())) return $(this);
                });
                $(select).data('filter', rows.size() != filter_rows.size());

                $(select).html(filter_rows);
                $(select).change();
                //for(var i=select.options.length-1; i>=0; i--){
                //    if(select.options[i].text.substr(0, text.length).toLowerCase() != text.toLowerCase()){
                //        select.remove(i);
                //    }
                //}
            });

        });
    };
})(jQuery);

//select autosize
;(function($) {
    $.fn.selectAutoSize = function(){
        return $(this).each(function(){
			$(this).mouseover(function(){
				if($(this).data('ss')) return;
				var ss = $(this).clone();
				ss.attr('id', ss.attr('id') + '_clone' + parseInt(Math.random() * 9000 + 1000))
				ss.css('width', 'auto');
				ss.css('top', $(this).offset().top + 'px');
				ss.css('left', $(this).offset().left + 'px');
				ss.css('position', 'absolute');
				ss.css('zIndex', '1000');
				ss.data('rel', this);
				ss.get(0).selectedIndex = this.selectedIndex;
				$(this).data('ss', ss)
				$('body').append(ss);
				ss.focus();
				ss.change(function(){
					$(this).data('rel').selectedIndex = this.selectedIndex;
					$($(this).data('rel')).data('ss', null);
					$($(this).data('rel')).change();
					$(this).remove();
				});
				ss.blur(function(){
					$($(this).data('rel')).data('ss', null);
					$(this).remove();
				});
			});
		});
	};
})(jQuery);
